
//
//  StatusDAL.swift
//  Weibo
//
//  Created by wuxl on 15/7/22.
//  Copyright © 2015年 heima. All rights reserved.
//

import Foundation

/// 微博数据访问层
class StatusDAL {
     /// 清除数据库缓存
    class func clearDBCache() {
        
        let formatter = NSDateFormatter()
        formatter.locale = NSLocale(localeIdentifier: "en")
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        // 取比当前时间早一天的日期
//        let date = NSDate(timeIntervalSinceNow: -24 * 60 * 60)
        let date = NSDate(timeIntervalSinceNow: -60)
        let dateStr = formatter.stringFromDate(date)
        
        print(dateStr)
        
        let sql = "DELETE FROM T_Status WHERE createDate < '\(dateStr)';"

        
        SQLiteManager.sharedSQLiteManager.queue?.inDatabase({ (db) -> Void in
            db.executeUpdate(sql)
        })
    }
    
    ///  加载微博数据
    class func loadStatus(since_id: Int, max_id: Int, finished:(array: [[String: AnyObject]]?, error: NSError?) -> ()) {
        // 1. 检查本地是否有缓存的数据
        StatusDAL.loadCacheStatus(since_id, max_id: max_id) { (array) -> () in
            // 2. 如果有直接返回
            if !array.isEmpty {
                // 返回字典数组
                finished(array: array, error: nil)
                
                return
            }
            
            // 3. 如查没有，加载网络数氢
            // 发起网络请求
            NetworkTools.sharedNetworkTools().loadStatus(since_id, max_id: max_id) { (array, error) -> () in
            
                // 4. 将网络数据保存到数据库供下次使用
                if array != nil {
                    StatusDAL.saveStatus(array!)
                }
                
                // 回调执行结果
                finished(array: array, error: error)
            }
        }

    }
    
    /// 加载缓存数据
    /// 1. 参数
    /**
        since_id  若指此参数，则返回ID比since_id大的微博(即比since_id时间歇的微博)，默认为0
        max_id    若指定此参数，则返回ID小于或等于max_id的微博，默认为0
    */
    private class func loadCacheStatus(since_id: Int, max_id: Int, finished:(array: [[String: AnyObject]]) -> () ) {
        assert(sharedUserAccount != nil, "必须登录之后，才能执行此方法")
        // 2. SQL
        var sql = "SELECT statusId, status, userId FROM T_Status \n" +
        "WHERE userId = \(sharedUserAccount!.uid) \n"
        
        if since_id > 0 {
            sql += "AND statusId > \(since_id) \n"
        } else if max_id > 0 {
            sql += "AND statusId < \(max_id) \n"
        }
        
        sql += "ORDER BY statusId DESC LIMIT 20;"
        
        // 测试sql 
        print(sql)
        
        // 3. 执行 SQL
        SQLiteManager.sharedSQLiteManager.queue?.inTransaction({ (db, _) -> Void in
            let rs = db.executeQuery(sql)!
            
            // 遍历结果集合 - 思考，返回什么？ '字典数组'即可，和网络返回的数据格式相一致
            // 字典是一条完整的微博数据的字典
            var array = [[String: AnyObject]]()
            while rs.next() {
                let str = rs.stringForColumn("status")
                
                // 字符串 -> 二进制数据 -> 字典
                let data = str.dataUsingEncoding(NSUTF8StringEncoding)!
                let dict = try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(rawValue: 0)) as! [String: AnyObject]
                
                array.append(dict)
            }
            
            // 完成回调
            finished(array: array)
        })
    }
    
    ///  将微博数据保存到数据库
    ///  1. 参数：网络返回的字典数组，作为参数
    private class func saveStatus(array: [[String: AnyObject]]) {
        assert(sharedUserAccount != nil, "必须登录之后，才能执行此方法")
        // 2. SQL
        let sql = "INSERT OR REPLACE INTO T_Status (statusId, status, userId) VALUES(?, ?, ?);"
       
        // 2.1 userId
        let userId = sharedUserAccount!.uid
        
        // 3. 遍历数组
        for dict in array {
            // 3.1 statusId 
            let statusId = dict["id"] as! Int
            // 3.2 status 字典 -> 二进制数据 -> 字符串
            let data = try! NSJSONSerialization.dataWithJSONObject(dict, options: NSJSONWritingOptions(rawValue: 0))
            let str = NSString(data: data, encoding: NSUTF8StringEncoding)!
            
            // 4. 执行 sql
            SQLiteManager.sharedSQLiteManager.queue!.inTransaction({ (db, rollback) -> Void in
                if !db.executeUpdate(sql, statusId, str, userId) {
                    rollback.memory = true
                }
            })
        }
    }
}